Unix Domain Sockets (UDS) হলো একটি Inter-Process Communication (IPC) মেকানিজম, যা একই মেশিনের (সিস্টেমের) মধ্যে চলমান প্রক্রিয়াগুলোর মধ্যে দ্রুত এবং কার্যকরভাবে ডেটা আদান-প্রদান করতে ব্যবহৃত হয়। এটি TCP/IP স্যুট-এর বিকল্প হিসেবে ব্যবহৃত হয়, যেখানে প্রক্রিয়াগুলো নেটওয়ার্ক প্রোটোকল ব্যবহার না করে লোকালি যোগাযোগ করে। UDS প্রোটোকলটি সাধারণত AF_UNIX বা AF_LOCAL নামে পরিচিত এবং এটি লোকালহোস্টের মধ্যে প্রক্রিয়াগুলোর মধ্যে যোগাযোগের জন্য আদর্শ।
Unix Domain Sockets ব্যবহার করে লোকাল প্রক্রিয়াগুলোর মধ্যে IPC প্রয়োগ করা যায়। UDS বিভিন্ন অ্যাপ্লিকেশন এবং সার্ভিসে ব্যবহৃত হয়, যেমন ডাটাবেস সার্ভার, ডেমন, এবং সিস্টেম সার্ভিস, যেগুলো একই সিস্টেমের মধ্যে দ্রুত যোগাযোগের প্রয়োজন হয়।
নিচে একটি উদাহরণ দেওয়া হলো যেখানে Unix Domain Sockets ব্যবহার করে একটি সার্ভার এবং ক্লায়েন্ট তৈরি করা হয়েছে:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SOCKET_PATH "/tmp/uds_socket"
int main() {
int server_fd, client_fd;
struct sockaddr_un server_addr, client_addr;
socklen_t client_len;
char buffer[100];
// 1. Socket তৈরি করা
if ((server_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// 2. ঠিকানা সেটআপ করা
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_UNIX;
strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);
// 3. Binding করা
unlink(SOCKET_PATH);
if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// 4. Listening করা
if (listen(server_fd, 5) < 0) {
perror("Listen failed");
close(server_fd);
exit(EXIT_FAILURE);
}
printf("Server is listening...\n");
client_len = sizeof(client_addr);
// 5. Accepting সংযোগ
if ((client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_len)) < 0) {
perror("Accept failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// 6. ডেটা গ্রহণ করা
int n = read(client_fd, buffer, sizeof(buffer));
buffer[n] = '\0';
printf("Client: %s\n", buffer);
// 7. ডেটা পাঠানো
write(client_fd, "Hello from server", 17);
// 8. Socket বন্ধ করা
close(client_fd);
close(server_fd);
unlink(SOCKET_PATH);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SOCKET_PATH "/tmp/uds_socket"
int main() {
int client_fd;
struct sockaddr_un server_addr;
char buffer[100];
// 1. Socket তৈরি করা
if ((client_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// 2. সার্ভার ঠিকানা সেটআপ করা
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_UNIX;
strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);
// 3. সার্ভারের সাথে সংযোগ স্থাপন করা
if (connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Connection failed");
close(client_fd);
exit(EXIT_FAILURE);
}
// 4. ডেটা পাঠানো
write(client_fd, "Hello from client", 17);
// 5. ডেটা গ্রহণ করা
int n = read(client_fd, buffer, sizeof(buffer));
buffer[n] = '\0';
printf("Server: %s\n", buffer);
// 6. Socket বন্ধ করা
close(client_fd);
return 0;
}
socket()
ফাংশন AF_UNIX এবং SOCK_STREAM দিয়ে Socket তৈরি করে।listen()
ফাংশন সার্ভারকে ইনকামিং সংযোগের জন্য অপেক্ষা করায়।accept()
ফাংশন ইনকামিং সংযোগ গ্রহণ করে।read()
এবং write()
ফাংশন ক্লায়েন্ট থেকে ডেটা গ্রহণ এবং ক্লায়েন্টে ডেটা পাঠানোর জন্য ব্যবহৃত হয়।socket()
ফাংশন AF_UNIX এবং SOCK_STREAM দিয়ে ক্লায়েন্টের Socket তৈরি করে।connect()
ফাংশন সার্ভারের সাথে সংযোগ স্থাপন করে।write()
এবং read()
ফাংশন ডেটা পাঠানো এবং গ্রহণের জন্য ব্যবহৃত হয়।common.read_more